package org.domain.sigepac.Entity;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.validator.Length;
import org.hibernate.validator.NotNull;


@Entity
@Table(name="tb_visita")
public class Visita extends EntidadeAbstrata {

	private static final long serialVersionUID = -2668182497115320690L;

	@Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

	@Temporal(TemporalType.DATE)
	@Column(name="dt_visita",nullable=false)
	@NotNull
	private Date dataVisita;

	@Column(name="qtd_alunos",nullable=false)
	@NotNull
	private Integer alunosPresentes;

	@Column(name="materia_ministrada",nullable=false,length=5000)
	@NotNull
	private String materiaMinistrada;

	@Column(name="descricao_ambiente",nullable=false,length=5000)
	@NotNull
	private String descricaoAmbiente;

	@Column(name = "descricao", nullable = false, length = 5000)
	@NotNull
	@Length(max = 5000)
	private String descricao;


	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "id_turma", referencedColumnName = "id", nullable = false)
	private Turma turma;


	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "id_usuario", referencedColumnName = "id", nullable = false)
	private Usuario usuario;


	@Enumerated(EnumType.STRING)
	@Column(name = "turno", nullable = false, length=10)
	private Turno turno;

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "visita")
	@Cascade({CascadeType.ALL, CascadeType.DELETE_ORPHAN})
	private Set<ItensVisita> itensVisita;

	public Date getDataVisita() {
		return dataVisita;
	}

	public void setDataVisita(Date dataVisita) {
		this.dataVisita = dataVisita;
	}

	public Integer getAlunosPresentes() {
		return alunosPresentes;
	}

	public void setAlunosPresentes(Integer alunosPresentes) {
		this.alunosPresentes = alunosPresentes;
	}

	public String getMateriaMinistrada() {
		return materiaMinistrada;
	}

	public void setMateriaMinistrada(String materiaMinistrada) {
		this.materiaMinistrada = materiaMinistrada;
	}

	public String getDescricaoAmbiente() {
		return descricaoAmbiente;
	}

	public void setDescricaoAmbiente(String descricaoAmbiente) {
		this.descricaoAmbiente = descricaoAmbiente;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public Turma getTurma() {
		return turma;
	}

	public void setTurma(Turma turma) {
		this.turma = turma;
	}

	public Serializable getId() {
		return id;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public Set<ItensVisita> getItensVisita() {
		if(itensVisita==null){
			itensVisita=new HashSet<ItensVisita>();

			for(AspectosVisita aspecto:AspectosVisita.values()){
				ItensVisita item= new ItensVisita();
				item.setVisita(this);
				item.setAspecto(aspecto);
				itensVisita.add(item);
			}
		}
		return itensVisita;
	}

	public List<ItensVisita> getItensInfra(){
		List<ItensVisita> tmp=new ArrayList<ItensVisita>();

		for(ItensVisita item: getItensVisita()){
			if(item.getAspecto().getTipo()==1)
				tmp.add(item);
		}
		return tmp;
	}

	public List<ItensVisita> getItensMetodo(){
		List<ItensVisita> tmp=new ArrayList<ItensVisita>();

		for(ItensVisita item: getItensVisita()){
			if(item.getAspecto().getTipo()==2)
				tmp.add(item);
		}
		return tmp;
	}

	public void setItensVisita(Set<ItensVisita> itensVisita) {
		this.itensVisita = itensVisita;
	}

	public Turno getTurno() {
		return turno;
	}
	public void setTurno(Turno turno) {
		this.turno = turno;
	}

}
